import app from '@system.app';

const THEME = [{
   bgcolor: "#D4C8BD",
   text: "",
   color: "#776E65",
   size: "64px"
}, {
   bgcolor: "#EEE4DA",
   text: "2",
   color: "#776E65",
   size: "64px"
}, {
   bgcolor: "#EEE1C9",
   text: "4",
   color: "#776E65",
   size: "64px"
}, {
   bgcolor: "#F3B27A",
   text: "8",
   color: "#F9F6F2",
   size: "64px"
}, {
   bgcolor: "#F69664",
   text: "16",
   color: "#F9F6F2",
   size: "48px"
}, {
   bgcolor: "#F77C5F",
   text: "32",
   color: "#F9F6F2",
   size: "48px"
}, {
   bgcolor: "#F75F3B",
   text: "64",
   color: "#F9F6F2",
   size: "48px"
}, {
   bgcolor: "#EDD073",
   text: "128",
   color: "#F9F6F2",
   size: "48px"
}, {
   bgcolor: "#EDCC62",
   text: "256",
   color: "#F9F6F2",
   size: "48px"
}, {
   bgcolor: "#ECC402",
   text: "512",
   color: "#F9F6F2",
   size: "48px"
}, {
   bgcolor: "#C9DD22",
   text: "1024",
   color: "#F9F6F2",
   size: "32px"
}, {
   bgcolor: "#60D992",
   text: "2048",
   color: "#F9F6F2",
   size: "32px"
}];

var grid = new Array(16);

export default {
    data: {
        score: 0, // 当前得分
        bestScore: 0, // 最高分
        tiles: [], // 方格信息
        showGameOver: false // 是否显示游戏结束画面
    },
    onInit() {
        this.initGame();
    },
    onSwipe(event) {
        let isMoved = false;
        switch (event.direction) { // 根据方向移动场上格子
            case "up": isMoved = this.moveTile(0, 1, 4); break;
            case "down": isMoved = this.moveTile(12, 1, -4); break;
            case "left": isMoved = this.moveTile(0, 4, 1); break;
            case "right": isMoved = this.moveTile(3, 4, -1); break;
        }
        if (isMoved) { // 如果格子发生改变
            this.addTile(); // 生成新的数字
            this.updateGrid(); // 绘制格子
            if (this.isGameOver()) { // 如果游戏结束则显示游戏结束并更新最高分
                this.showGameOver = true;
                if (this.score > this.bestScore) {
                    this.bestScore = this.score;
                }
            }
        }
    },
    quit() {
        app.terminate();
    },
    initGame() {
        this.score = 0;
        for (let i = 0; i < grid.length; i++) // 将 16 个格子都设为空
             grid[i] = 0;
        this.addTile();
        this.addTile(); // 生成两个数字
        this.updateGrid(); // 绘制格子
        this.showGameOver = false; // 隐藏游戏结束画面
    },
    moveTile(origin, delta, step) {
        if (this.showGameOver) return false; // 游戏结束则不移动格子
        let isMoved = false;
        for (let i = 0; i < 4; i++) { // 遍历每行或每列
            let c = origin + i * delta; // 每行或每列的第一个元素
            for (let j = 0; j < 3; j++) { // 遍历当前行或列除了最后一个元素的每个元素
                let next = -1;
                for (let k = 1; k < 4 - j; k++) { // 找第j个元素step那侧下一个不为0的位置
                    if (grid[c + k * step] != 0) {
                        next = c + k * step;
                        break;
                    }
                }
                if (next > -1) { // 如果找到则进行移动合并
                    if (grid[c] == 0) { // 进行移动
                        grid[c] = grid[next];
                        grid[next] = 0;
                        isMoved = true;
                        continue; // c 不变直接进入下轮循环
                    } else if (grid[c] == grid[next]) { // 进行合并
                        grid[c]++;
                        this.score += 2 ** grid[c];
                        grid[next] = 0;
                        isMoved = true;
                    }
                } else { // 否则说明这行或列无法移动合并
                    break;
                }
                c += step;
            }
        }
        return isMoved;
    },
    addTile() {
        let empty = []; // 用于存放空格子位置的数组
        for (let i = 0; i < grid.length; i++) {
            if (grid[i] == 0) {
                // 遍历所有的格子，当格子为空时将其位置加入数组
                empty.push(i);
            }
        }
        // 从中随机挑选一个位置
        let i = Math.floor(Math.random() * empty.length);
        // 2 出现的概率比 4 大
        grid[empty[i]] = Math.random() < 0.8 ? 1 : 2;
    },
    isGameOver() {
        // 如果有空格子则游戏继续
        for (let i = 0; i < grid.length; i++) {
            if (grid[i] == 0) return false;
        }
        // 否则如果有的格子周围有和它数字一样的格子，即有可以合并的相邻格子，则游戏继续
        for (let y = 0; y < 3; y++) {
            for (let x = 0; x < 3; x++) {
                if (grid[4 * y + x] == grid[4 * (y + 1) + x]) return false;
                if (grid[4 * y + x] == grid[4 * y + (x + 1)]) return false;
            }
        }
        // 否则游戏结束
        return true;
    },
    updateGrid() {
        let newTiles = [];
        // 遍历 grid，将数字对应的方格的文字，颜色，大小等信息加入到 tiles 中
        for (let i = 0; i < grid.length; i++) {
            newTiles.push(THEME[grid[i]]);
        }
        this.tiles = newTiles;
    }
}
